访问电脑版页面

导航:老古开发网手机版STM32单片机STM32单片机的ADC

STM32:ADC采集数据实例(采用DMA模式)

导读:SOC:STM32F103RCT6软件平台:STM官方库V3.5.0开发工具:Keil1. 摘要 本文章将给出STM32F103RCT6控制AT24C02的代码。如有疑问和错误,欢迎留言告之。2.硬件连接AT24C02使用I2C进行数据访问,板子上使用STM32的I2C控制
关键字:
adc,dma模式,STM32,采集数据,

SOC:STM32F103RCT6

软件平台:STM官方库V3.5.0

开发工具:Keil


1. 摘要

本文章将给出STM32F103RCT6控制AT24C02的代码。如有疑问和错误,欢迎留言告之。


2.硬件连接


AT24C02使用I2C进行数据访问,板子上使用STM32的I2C控制器2和AT24C02进行连接。

具体来说,PB10作为SCL和AT24C02相连,PB11作为SDL和AT24C02相连。

这里就不给出硬件连接图了,比较简单。


3.AT24C022C访问代码(轮询)

I2C这里使用轮询方法,不是中断,请留意。

首先,给出I2C控制器的初始化代码,和读写代码,一共三个函数,对应三个功能。

注意:这里是使用I2C控制器2。


#include"stm32f10x.h"

#include"stm32f10x_i2c.h"

#include

voidI2C2_Init(I2C_InitTypeDef*I2C_InitStruct)

{

GPIO_InitTypeDefGPIO_InitStruct;

RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C2,ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);

/*配置IO管脚*/

GPIO_InitStruct.GPIO_Pin=GPIO_Pin_10|GPIO_Pin_11;

GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;

GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_OD;

GPIO_Init(GPIOB,&GPIO_InitStruct);

I2C_Init(I2C2,I2C_InitStruct);

I2C_Cmd(I2C2,ENABLE);

//配置NVIC

/*NVIC_InitStructure.NVIC_IRQChannel=I2C2_EV_IRQn;//I2C事件中断

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;//抢占优先级1

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x02;//子优先级2

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//使能中断通道

NVIC_Init(&NVIC_InitStructure);//根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器*/

//I2C_ITConfig(I2C2,I2C_IT_EVT,ENABLE);//打开事件中断

}

/*i2c写一个字节*/

/*ByteWrite*/

voidI2C2_WriteByte(uint8_tDeviceAddress,uint8_tMemoryAddress,uint8_tData)

{

while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));//等待I2C空闲

//start

I2C_GenerateSTART(I2C2,ENABLE);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);

//deviceaddress

I2C_Send7bitAddress(I2C2,DeviceAddress,I2C_Direction_Transmitter);//写模式

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);

//printf("addressoverrn");

//memoryaddress

I2C_SendData(I2C2,MemoryAddress);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

//data

I2C_SendData(I2C2,Data);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

//stop

I2C_GenerateSTOP(I2C2,ENABLE);

}

/*i2c读一个字节*/

/*RandomRead*/

uint8_tI2C2_ReadByte(uint8_tDeviceAddress,uint8_tMemoryAddress)

{

uint8_tData;

while(I2C_GetFlagStatus(I2C2,I2C_FLAG_BUSY));//等待I2C空闲

//start

I2C_GenerateSTART(I2C2,ENABLE);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);//ev5

//deviceaddress

I2C_Send7bitAddress(I2C2,DeviceAddress,I2C_Direction_Transmitter);//写模式

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)!=SUCCESS);//ev6

//memoryaddress

I2C_SendData(I2C2,MemoryAddress);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_TRANSMITTED)!=SUCCESS);

//start

I2C_GenerateSTART(I2C2,ENABLE);

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_MODE_SELECT)!=SUCCESS);

//deviceaddress

I2C_Send7bitAddress(I2C2,DeviceAddress,I2C_Direction_Receiver);//读模式

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)!=SUCCESS);

/*按照manual的图273,先读取数据,关闭ACK应答,最后发出STOP*/

while(I2C_CheckEvent(I2C2,I2C_EVENT_MASTER_BYTE_RECEIVED)!=SUCCESS);/*等待读取事件,再读取数据*/

Data=I2C_ReceiveData(I2C2);

I2C_AcknowledgeConfig(I2C2,DISABLE);//关闭应答和停止条件产生

printf("receivedrn");

I2C_GenerateSTOP(I2C2,ENABLE);

I2C_AcknowledgeConfig(I2C2,ENABLE);

returnData;

}


接着给出相应的AT24C02访问代码


#include"stm32f10x.h"

#include"stm32f10x_i2c.h"

#include"i2c.h"

#include"delay.h"

#include

/*从AT24CXX的指定地址开始读出一个字节*/

uint8_tAT24CXX_ReadByte(uint8_tReadAddr)

{

returnI2C2_ReadByte(0xA0,ReadAddr);

}

/*向AT24CXX的指定地址开始写入一个字节*/

voidAT24CXX_WriteByte(uint8_tWriteAddr,uint8_tData)

{

I2C2_WriteByte(0xA0,WriteAddr,Data);

}

voidAT24CXX_test(void)

{

uint8_ti;

I2C_InitTypeDefI2C_InitStructure;

I2C_InitStructure.I2C_ClockSpeed=200000;//200kHZ

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;

来源:互联网   作者:karen  2018/8/14 10:00:02
栏目: [ STM32单片机的ADC]

相关阅读

一文带你看懂Stm32定时器+ADC+DMA进行AD采样的实现

STM32学习笔记之ADC转换

基于STM32单片机的ADC与DMA配置的介绍与使用

STM32单片机ADC库函数的定义和使用方法

STM32单片机对ADS1246芯片的驱动

STM32 ADC应用要注意的几点问题

STM32单片机如何实现规则多通道转换

Stm32f103 ADC 学习笔记

如何实现STM32F407单片机的ADC转换

STM32单片机的定时器和ADC的应用方法介绍

STM32:ADC采集数据实例(采用DMA模式)

一种经典的STM32 ADC多通道转换详细解析

介绍一种关于STM32 ADC 多通道16路电压采集技术

STM32的ADC转换最常见的方式

STM32的ADC编程方法总结

基于STM32内置ADC实现简易示波器的程序设计与实现

如何在STM32中得到最佳的ADC精度

STM32单片机的ADC多通道采样

基于STM32单片机ADC连续采集和DMA循环转换

STM32学习:ADC/DMA/USART